﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>数组 - 定义 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="Arrays are either data structures consisting of a collection of values, each identified by one key, or a collection of sequentially numbered variables." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>

<body>
<h1>数组</h1>
<p>在 AutoHotkey 中, 有两种不同类型的事物与数组相关:</p>
<ul>
  <li><a href="#object-based">基于对象的数组</a></li>
  <li><a href="#pseudo">伪数组</a>(不推荐使用)</li>
</ul>
<p class="note"><strong>注意</strong>: 下面的示例代码显示了导致相同最终结果的不同方法.</p>

<h2 id="object-based">基于对象的数组</h2>
<p>这样的数组可以是<a href="../Objects.htm#Usage_Associative_Arrays">关联数组</a>或<a href="../Objects.htm#Usage_Simple_Arrays">简单数组</a>. 关联数组使用 映射 函数创建, 而简单数组使用 数组 函数或方括号语法创建. 有关更多信息, 请参阅<a href="../Tutorial.htm#s7">初学者向导(快速入门)</a> 或<a href="../Objects.htm">对象页面</a>.</p>

<p>以下示例展示了简单数组的用法:</p>
<pre><em>; 创建数组后, 初始为空:</em>
MyArray := [] <em>; 或 MyArray := 数组()</em>

<em>; 写入数据到数组:</em>
循环读取 内_系统目录 "\system.ini" <em>; 此循环获取文件中的每行, 一次一行.</em>
{
    MyArray.Push(内_循环读取行) <em>; 添加此行到数组中.</em>
}

<em>; 从数组中读取:
; 循环 MyArray.Length   ; 较传统的方式.</em>
遍历 index, element in MyArray <em>; 在大多数情况下建议使用枚举的方式.</em>
{
    <em>; 使用 "Loop", 索引必须是连续的数字
    ; 从 1 到数组中元素的个数(或者必须在循环中进行计算).
    ; 信息框 "Element number " . 内_循环次数 . " is " . MyArray[内_循环次数]

    ; 使用 "for", 同时提供了索引(或"键") 及与它关联的值
    ; 并且索引可以是您选择的*任何*值.</em>
    信息框 "Element number " . index . " is " . element
}</pre>
<p>这只显示了简单数组提供的<a href="../objects/Array.htm">功能</a>的一小部分(或关联数组(也称为 映射 对象) 提供的<a href="../objects/Map.htm">功能</a>的一小部分). 可以设置, 获取, 插入, 移除和枚举项目. 除了数字, 字符串和任何类型的和对象都可以用作键. 对象可以作为值存储到其他对象中, 并且可以作为函数参数或返回值传递. 对象还可以使用新特性进行<a href="../Objects.htm#Custom_Objects">扩展</a>.</p>
<p>尽管 Push() 和枚举器有它们的用途, 不过一些用户可能会发现使用更为传统的方法更容易(注释掉的行对应使用下面描述<a href="#pseudo">伪数组</a>):</p>
<pre>
<em>; 每个数组在使用前必须进行初始化:</em>
MyMap := 映射()

<em>; MyMap%j% := 内_循环属性</em>
MyMap[j] := 内_循环属性

<em>; MyMap%j%_%k% := 内_循环读取行</em>
MyMap[j] := 映射()
MyMap[j][k] := 内_循环读取行

MyMapLength := 0
循环读取 内_系统目录 "\system.ini"
{
    MyMapLength += 1
    <em>; MyMap%MyMapLength% := 内_循环读取行</em>
    MyMap[MyMapLength] := 内_循环读取行
}

循环 MyMapLength
{
    <em>; element := MyMap%内_循环次数%</em>
    element := MyMap[内_循环次数]
    <em>; 信息框 "Element number " . 内_循环次数 . " is " . MyMap%内_循环次数%</em>
    信息框 "Element number " . 内_循环次数 . " is " . MyMap[内_循环次数]
}
</pre>
<p>为了方便起见, <i>MyMapLength</i> 保留为变量, 但可以使用 <code>MyMap.Length := <i>n</i></code> 存储在数组本身中, 也可以将其删除并使用 <code>MyMap.<a href="../objects/Map.htm#Count">Count</a></code> 代替.</p>

<h2 id="pseudo">伪数组</h2>
  <p class="note"><strong>注意</strong>: 如果可能, 请总是使用上面提到的基于对象的数组. 它在几乎每个方面都优于伪数组: 它具有节省空间, 更灵活, 更清晰, 与许多其他编程语言相似的特点.</p>
<p>伪数组主要是概念性的: 每个数组实际上只是按顺序编号的<a href="../Variables.htm">变量</a>或<a href="../Functions.htm">函数</a>的集合, 每个变量或函数都被视为数组的 <em>element(元素)</em>. AutoHotkey 不会以任何方式将这些元素链接在一起.</p>
<p>任何接受 OutputVar 的函数或为变量赋值都可以用来创建数组. 最简单的示例是<a href="../commands/SetExpression.htm">赋值运算符(:=)</a>, 如下所示:</p>
<pre>数组%j% := 内_循环属性</pre>
<p>通过在索引之间使用所选的分隔符, 可以实现多维数组. 例如:</p>
<pre>数组%j%_%k% := 内_循环读取行</pre>
<p>下面的示例演示了如何创建和访问数组, 这里是从文本文件中检索一系列名称:</p>
<pre><em><strong>; 写入到数组:</strong></em>
ArrayCount := 0
循环读取 内_系统目录 "\system.ini"   <em>; 此循环获取文件中的每行, 一次一行.</em>
{
    ArrayCount += 1  <em>; 记录数组中的项目数.</em>
    数组%ArrayCount% := 内_循环读取行  <em>; 把此行保存到数组中的下一个元素.</em>
}

<em><strong>; 从数组中读取:</strong></em>
循环 ArrayCount
{
    <em>; 下一行使用 := 运算符获取数组元素:</em>
    element := 数组%内_循环次数%  <em>; <a href="../Variables.htm#Index">内_循环次数</a> 是内置变量.</em>
    <em>; 可选地, 您可以执行以下操作, 因为默认情况下所有函数都接受<a href="../Variables.htm#Expressions">表达式</a> by default:</em>
    信息框 &quot;Element number &quot; . 内_循环次数 . &quot; is &quot; . 数组%内_循环次数%
}</pre>
<p>与数组有关的一个概念是使用 <a href="../commands/NumPut.htm">置数值</a> 和 <a href="../commands/NumGet.htm">获取数值</a> 以二进制格式存储/检索数字集合. 在对性能和/或内存占用有要求的情况下, 这可能会有所帮助.</p>

</body>
</html>